package com.huitone.smspfm.redis.model;

import java.util.ArrayList;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.bin.common.utils.StringUtils;

public class SmsEntity {
	
	private static Logger logger = LogManager.getLogger(SmsEntity.class);
	
	private static StringRedisSerializer serializer = new StringRedisSerializer();
	
	private String sequence;
	
	private String srvNode;
	private String smType;
	private String serviceCode;
	private String user;
	
	/**
	 * 短信内容
	 */
	private String smcont;
	private int reportflag;
	private String recvTime;
	private String recvModuleName;
	private String dealModuleName;
	private String sdealTime;
	private String edealTime;
	private String dealResult;
	private String dealResultDesc;
	private String conSm;
	private String sendSeq;
	private String splitTimes;
	private String sendTime;
	private String sendResult;
	private String sendResultDesc;
	private String sendModuleName;
	private String notifySendTime;
	private int recvStatus;
	private String rSMInfoecvTime;
	private String recvErrorCode;
	private String recvErrorMsg;
	private String reportTime;
	private String reportModuleName;
	private String curDealDesc;
	private String curDealTime;
	private String curDealStatus;
	private String sendport;
	private String orgSvrNode;
	private String orgSerialNo;
	private String serialSegment;
	private String gateLinkId;
	
	private long codeRule;
	private long dateTime;
	private long serialNum;
	
	public static List<Object> getColumns() {
		List<Object> hashKeys = new ArrayList<>();
		hashKeys.add("Srv_node");
		hashKeys.add("ServiceCode");
		hashKeys.add("SmType");
		hashKeys.add("User");
		hashKeys.add("Smcont");
		hashKeys.add("Reportflag");
		hashKeys.add("recvTime");
		hashKeys.add("RecvModuleName");
		hashKeys.add("DealModuleName");
		hashKeys.add("SdealTime");
		hashKeys.add("EdealTime");
		hashKeys.add("DealResult");
		hashKeys.add("DealResultDesc");
		hashKeys.add("ConSm");
		hashKeys.add("Send_seq");
		hashKeys.add("Split_times");
		hashKeys.add("SendTime");
		hashKeys.add("SendResult");
		hashKeys.add("SendResultDesc");
		hashKeys.add("SendModuleName");
		hashKeys.add("Notify_send_time");
		hashKeys.add("RecvStatus");
		hashKeys.add("RecvTime");
		hashKeys.add("RecvErrorCode");
		hashKeys.add("RecvErrorMsg");
		hashKeys.add("ReportTime");
		hashKeys.add("ReportModuleName");
		hashKeys.add("CurDealDesc");
		hashKeys.add("CurDealTime");
		hashKeys.add("CurDealStatus");
		hashKeys.add("SendPort");
		hashKeys.add("OrgSrvNode");
		hashKeys.add("OrgSerialNo");
		hashKeys.add("SerialSegment");
		hashKeys.add("GateLinkId");
		/*hashKeys.add("IReportTimes");
		hashKeys.add("ISendTimes");*/
		return hashKeys;
	}
	
	public static List<byte[]> getColumnsB() {
		
		//byte[][] bytz = new byte[33][];
		
		//bytz[0] = serializer.serialize("Srv_node");
		
		List<byte[]> hashKeys = new ArrayList<byte[]>();
		hashKeys.add(serializer.serialize("Srv_node"));
		hashKeys.add(serializer.serialize("ServiceCode"));
		hashKeys.add(serializer.serialize("SmType"));
		hashKeys.add(serializer.serialize("User"));
		hashKeys.add(serializer.serialize("Smcont"));
		hashKeys.add(serializer.serialize("Reportflag"));
		hashKeys.add(serializer.serialize("recvTime"));
		hashKeys.add(serializer.serialize("RecvModuleName"));
		hashKeys.add(serializer.serialize("DealModuleName"));
		hashKeys.add(serializer.serialize("SdealTime"));
		hashKeys.add(serializer.serialize("EdealTime"));
		hashKeys.add(serializer.serialize("DealResult"));
		hashKeys.add(serializer.serialize("DealResultDesc"));
		hashKeys.add(serializer.serialize("ConSm"));
		hashKeys.add(serializer.serialize("Send_seq"));
		hashKeys.add(serializer.serialize("Split_times"));
		hashKeys.add(serializer.serialize("SendTime"));
		hashKeys.add(serializer.serialize("SendResult"));
		hashKeys.add(serializer.serialize("SendResultDesc"));
		hashKeys.add(serializer.serialize("SendModuleName"));
		hashKeys.add(serializer.serialize("Notify_send_time"));
		hashKeys.add(serializer.serialize("RecvStatus"));
		hashKeys.add(serializer.serialize("RecvTime"));
		hashKeys.add(serializer.serialize("RecvErrorCode"));
		hashKeys.add(serializer.serialize("RecvErrorMsg"));
		hashKeys.add(serializer.serialize("ReportTime"));
		hashKeys.add(serializer.serialize("ReportModuleName"));
		hashKeys.add(serializer.serialize("CurDealDesc"));
		hashKeys.add(serializer.serialize("CurDealTime"));
		hashKeys.add(serializer.serialize("CurDealStatus"));
		hashKeys.add(serializer.serialize("SendPort"));
		hashKeys.add(serializer.serialize("OrgSrvNode"));
		hashKeys.add(serializer.serialize("OrgSerialNo"));
		hashKeys.add(serializer.serialize("SerialSegment"));
		hashKeys.add(serializer.serialize("GateLinkId"));
		
		return hashKeys;
	}
	
	/*public static SmsEntity parseB(String sequence, List<byte[]> values) {
		
		SmsEntity entity = new SmsEntity();
		
		try {
			
			entity.setSequence(sequence);
			entity.setSrvNode(serializer.deserialize(values.get(0)));
			entity.setServiceCode(serializer.deserialize(values.get(0)));
			entity.setSmType(serializer.deserialize(values.get(0)));
			entity.setUser(serializer.deserialize(values.get(0)));
			entity.setSmcont(serializer.deserialize(values.get(0)));
			entity.setReportflag(StringUtils.toInteger(serializer.deserialize(values.get(0))));
			entity.setRecvTime(serializer.deserialize(values.get(0)));
			entity.setRecvModuleName(serializer.deserialize(values.get(0)));
			entity.setDealModuleName(serializer.deserialize(values.get(0)));
			entity.setSdealTime(serializer.deserialize(values.get(0)));
			entity.setEdealTime(serializer.deserialize(values.get(0)));
			entity.setDealResult(serializer.deserialize(values.get(0)));
			entity.setDealResultDesc(serializer.deserialize(values.get(0)));
			entity.setConSm(serializer.deserialize(values.get(0)));
			entity.setSendSeq(serializer.deserialize(values.get(0)));
			entity.setSplitTimes(serializer.deserialize(values.get(0)));
			entity.setSendTime(serializer.deserialize(values.get(0)));
			entity.setSendResult(serializer.deserialize(values.get(0)));
			entity.setSendResultDesc(serializer.deserialize(values.get(0)));
			entity.setSendModuleName(serializer.deserialize(values.get(0)));
			entity.setNotifySendTime(serializer.deserialize(values.get(0)));
			entity.setRecvStatus(StringUtils.toInteger(serializer.deserialize(values.get(0))));
			entity.setRecvTime(serializer.deserialize(values.get(0)));
			entity.setRecvErrorCode(serializer.deserialize(values.get(0)));
			entity.setRecvErrorMsg(serializer.deserialize(values.get(0)));
			entity.setReportTime(serializer.deserialize(values.get(0)));
			entity.setReportModuleName(serializer.deserialize(values.get(0)));
			entity.setCurDealDesc(serializer.deserialize(values.get(0)));
			entity.setCurDealTime(serializer.deserialize(values.get(0)));
			entity.setCurDealStatus(serializer.deserialize(values.get(0)));
			entity.setSendport(serializer.deserialize(values.get(0)));
			entity.setOrgSvrNode(serializer.deserialize(values.get(0)));
			entity.setOrgSerialNo(serializer.deserialize(values.get(0)));
			entity.setSerialSegment(serializer.deserialize(values.get(0)));
			entity.setGateLinkId(serializer.deserialize(values.get(0)));
			
		} catch (Exception e) {
			logger.error("SmsEntity短信信息读取时发生异常", e);
		}
		
		return entity;
	}*/
	
	public static SmsEntity parse(String sequence, List<Object> values) {
		
		SmsEntity entity = new SmsEntity();
		
		try {
			
			entity.setSequence(sequence);
			entity.setSrvNode(StringUtils.objToString(values.get(0)));
			entity.setServiceCode(StringUtils.objToString(values.get(1)));
			entity.setSmType(StringUtils.objToString(values.get(2)));
			entity.setUser(StringUtils.objToString(values.get(3)));
			entity.setSmcont(StringUtils.objToString(values.get(4)));
			entity.setReportflag(StringUtils.toInteger(values.get(5)));
			entity.setRecvTime(StringUtils.objToString(values.get(6)));
			entity.setRecvModuleName(StringUtils.objToString(values.get(7)));
			entity.setDealModuleName(StringUtils.objToString(values.get(8)));
			entity.setSdealTime(StringUtils.objToString(values.get(9)));
			entity.setEdealTime(StringUtils.objToString(values.get(10)));
			entity.setDealResult(StringUtils.objToString(values.get(11)));
			entity.setDealResultDesc(StringUtils.objToString(values.get(12)));
			entity.setConSm(StringUtils.objToString(values.get(13)));
			entity.setSendSeq(StringUtils.objToString(values.get(14)));
			entity.setSplitTimes(StringUtils.objToString(values.get(15)));
			entity.setSendTime(StringUtils.objToString(values.get(16)));
			entity.setSendResult(StringUtils.toString(values.get(17)));
			entity.setSendResultDesc(StringUtils.objToString(values.get(18)));
			entity.setSendModuleName(StringUtils.objToString(values.get(19)));
			entity.setNotifySendTime(StringUtils.objToString(values.get(20)));
			entity.setRecvStatus(StringUtils.toInteger(values.get(21)));
			entity.setRecvTime(StringUtils.objToString(values.get(22)));
			entity.setRecvErrorCode(StringUtils.objToString(values.get(23)));
			entity.setRecvErrorMsg(StringUtils.objToString(values.get(24)));
			entity.setReportTime(StringUtils.objToString(values.get(25)));
			entity.setReportModuleName(StringUtils.objToString(values.get(26)));
			entity.setCurDealDesc(StringUtils.objToString(values.get(27)));
			entity.setCurDealTime(StringUtils.objToString(values.get(28)));
			entity.setCurDealStatus(StringUtils.objToString(values.get(29)));
			entity.setSendport(StringUtils.objToString(values.get(30)));
			entity.setOrgSvrNode(StringUtils.objToString(values.get(31)));
			entity.setOrgSerialNo(StringUtils.objToString(values.get(32)));
			entity.setSerialSegment(StringUtils.objToString(values.get(33)));
			entity.setGateLinkId(StringUtils.toString(values.get(34)));
			/*entity.setiReportTimes(StringUtils.toInteger(values.get(34)));
			entity.setiSendTimes(StringUtils.toInteger(values.get(35)));*/
			
		} catch (Exception e) {
			logger.error("SmsEntity短信信息读取时发生异常", e);
		}
		
		return entity;
	}
	
	public static SmsEntity parse(List<String> list) {
		
		SmsEntity entity = new SmsEntity();
		
		try {
			
			entity.setSrvNode(StringUtils.objToString(list.get(0)));
			entity.setServiceCode(StringUtils.objToString(list.get(1)));
			entity.setSmType(StringUtils.objToString(list.get(2)));
			entity.setUser(StringUtils.objToString(list.get(3)));
			entity.setSmcont(StringUtils.objToString(list.get(4)));
			entity.setReportflag(StringUtils.toInteger(list.get(5)));
			entity.setRecvTime(StringUtils.objToString(list.get(6)));
			entity.setRecvModuleName(StringUtils.objToString(list.get(7)));
			entity.setDealModuleName(StringUtils.objToString(list.get(8)));
			entity.setSdealTime(StringUtils.objToString(list.get(9)));
			entity.setEdealTime(StringUtils.objToString(list.get(10)));
			entity.setDealResult(StringUtils.objToString(list.get(11)));
			entity.setDealResultDesc(StringUtils.objToString(list.get(12)));
			entity.setConSm(StringUtils.objToString(list.get(13)));
			entity.setSendSeq(StringUtils.objToString(list.get(14)));
			entity.setSplitTimes(StringUtils.objToString(list.get(15)));
			entity.setSendTime(StringUtils.objToString(list.get(16)));
			entity.setSendResult(StringUtils.toString(list.get(17)));
			entity.setSendResultDesc(StringUtils.objToString(list.get(18)));
			entity.setSendModuleName(StringUtils.objToString(list.get(19)));
			entity.setNotifySendTime(StringUtils.objToString(list.get(20)));
			entity.setRecvStatus(StringUtils.toInteger(list.get(21)));
			entity.setRecvTime(StringUtils.objToString(list.get(22)));
			entity.setRecvErrorCode(StringUtils.objToString(list.get(23)));
			entity.setRecvErrorMsg(StringUtils.objToString(list.get(24)));
			entity.setReportTime(StringUtils.objToString(list.get(25)));
			entity.setReportModuleName(StringUtils.objToString(list.get(26)));
			entity.setCurDealDesc(StringUtils.objToString(list.get(27)));
			entity.setCurDealTime(StringUtils.objToString(list.get(28)));
			entity.setCurDealStatus(StringUtils.objToString(list.get(29)));
			entity.setSendport(StringUtils.objToString(list.get(30)));
			entity.setOrgSvrNode(StringUtils.objToString(list.get(31)));
			entity.setOrgSerialNo(StringUtils.objToString(list.get(32)));
			entity.setSerialSegment(StringUtils.objToString(list.get(33)));
			entity.setGateLinkId(StringUtils.toString(list.get(34)));
			
			entity.setSequence(entity.getSerialSegment().replaceAll(",", ""));
			
		} catch (Exception e) {
			logger.error("SmsEntity短信信息读取时发生异常", e);
		}
		
		return entity;
	}
	
	public static int getCodeRule(String sequence) {
		
		int result = 0;
		
		if (!StringUtils.isEmpty(sequence)) {
			
			String tmp = sequence.substring(0, 6);
			
			result = StringUtils.toInteger(tmp, 0, true);
		}
		
		return result;
	}
	
	public static int getDateTime(String sequence) {
		
		int result = 0;
		
		if (!StringUtils.isEmpty(sequence)) {
			
			String tmp = sequence.substring(6, 16);
			
			result = StringUtils.toInteger(tmp, 0, true);
		}
		
		return result;
	}
	
	public static int getSerialNumber(String sequence) {
		
		int result = 0;
		
		if (!StringUtils.isEmpty(sequence)) {
			
			String tmp = sequence.substring(16, sequence.length());
			
			result = StringUtils.toInteger(tmp, 0, true);
		}
		
		return result;
	}
	
	public boolean isExists() {
		return !StringUtils.isEmpty(sequence) && !StringUtils.isEmpty(user);
	}
	
	public String getSrvNode() {
		return srvNode;
	}
	public void setSrvNode(String srvNode) {
		this.srvNode = srvNode;
	}
	public String getSmType() {
		return smType;
	}
	public void setSmType(String smType) {
		this.smType = smType;
	}
	public String getServiceCode() {
		return serviceCode;
	}
	public void setServiceCode(String serviceCode) {
		this.serviceCode = serviceCode;
	}
	public String getUser() {
		return user;
	}
	public void setUser(String user) {
		this.user = user;
	}
	public String getSmcont() {
		return smcont;
	}
	public void setSmcont(String smcont) {
		this.smcont = smcont;
	}
	public String getRecvTime() {
		return recvTime;
	}
	public void setRecvTime(String recvTime) {
		this.recvTime = recvTime;
	}
	public String getRecvModuleName() {
		return recvModuleName;
	}
	public void setRecvModuleName(String recvModuleName) {
		this.recvModuleName = recvModuleName;
	}
	public String getDealModuleName() {
		return dealModuleName;
	}
	public void setDealModuleName(String dealModuleName) {
		this.dealModuleName = dealModuleName;
	}
	public String getSdealTime() {
		return sdealTime;
	}
	public void setSdealTime(String sdealTime) {
		this.sdealTime = sdealTime;
	}
	public String getEdealTime() {
		return edealTime;
	}
	public void setEdealTime(String edealTime) {
		this.edealTime = edealTime;
	}
	public String getDealResultDesc() {
		return dealResultDesc;
	}
	public void setDealResultDesc(String dealResultDesc) {
		this.dealResultDesc = dealResultDesc;
	}
	public String getConSm() {
		return conSm;
	}
	public void setConSm(String conSm) {
		this.conSm = conSm;
	}
	public String getSendSeq() {
		return sendSeq;
	}
	public void setSendSeq(String sendSeq) {
		this.sendSeq = sendSeq;
	}
	public String getSplitTimes() {
		return splitTimes;
	}
	public void setSplitTimes(String splitTimes) {
		this.splitTimes = splitTimes;
	}
	public String getSendTime() {
		return sendTime;
	}
	public void setSendTime(String sendTime) {
		this.sendTime = sendTime;
	}
	public String getSendResultDesc() {
		return sendResultDesc;
	}
	public void setSendResultDesc(String sendResultDesc) {
		this.sendResultDesc = sendResultDesc;
	}
	public String getSendModuleName() {
		return sendModuleName;
	}
	public void setSendModuleName(String sendModuleName) {
		this.sendModuleName = sendModuleName;
	}
	public String getNotifySendTime() {
		return notifySendTime;
	}
	public void setNotifySendTime(String notifySendTime) {
		this.notifySendTime = notifySendTime;
	}
	public String getrSMInfoecvTime() {
		return rSMInfoecvTime;
	}
	public void setrSMInfoecvTime(String rSMInfoecvTime) {
		this.rSMInfoecvTime = rSMInfoecvTime;
	}
	public String getRecvErrorCode() {
		return recvErrorCode;
	}
	public void setRecvErrorCode(String recvErrorCode) {
		this.recvErrorCode = recvErrorCode;
	}
	public String getRecvErrorMsg() {
		return recvErrorMsg;
	}
	public void setRecvErrorMsg(String recvErrorMsg) {
		this.recvErrorMsg = recvErrorMsg;
	}
	public String getReportTime() {
		return reportTime;
	}
	public void setReportTime(String reportTime) {
		this.reportTime = reportTime;
	}
	public String getReportModuleName() {
		return reportModuleName;
	}
	public void setReportModuleName(String reportModuleName) {
		this.reportModuleName = reportModuleName;
	}

	public String getSequence() {
		return sequence;
	}

	public void setSequence(String sequence) {
		this.sequence = sequence;
	}

	public String getCurDealDesc() {
		return curDealDesc;
	}

	public void setCurDealDesc(String curDealDesc) {
		this.curDealDesc = curDealDesc;
	}

	public String getCurDealTime() {
		return curDealTime;
	}

	public void setCurDealTime(String curDealTime) {
		this.curDealTime = curDealTime;
	}

	public String getCurDealStatus() {
		return curDealStatus;
	}

	public void setCurDealStatus(String curDealStatus) {
		this.curDealStatus = curDealStatus;
	}

	@Override
	public String toString() {
		return "SmsEntity [sequence=" + sequence + ", srvNode=" + srvNode + ", serviceCode=" + serviceCode + ", user="
				+ user + ", smcont=" + smcont + ", reportflag=" + reportflag + ", recvTime=" + recvTime + ", sendport="
				+ sendport + "]";
	}
	
	public static void main(String[] str) {
		
		String sequence = "100001112020322501";
		
		System.out.println(getCodeRule(sequence));
		System.out.println(getDateTime(sequence));
		System.out.println(getSerialNumber(sequence));
	}

	public String getSendport() {
		return sendport;
	}

	public void setSendport(String sendport) {
		this.sendport = sendport;
	}

	public String getOrgSvrNode() {
		return orgSvrNode;
	}

	public void setOrgSvrNode(String orgSvrNode) {
		this.orgSvrNode = orgSvrNode;
	}

	public String getOrgSerialNo() {
		return orgSerialNo;
	}

	public void setOrgSerialNo(String orgSerialNo) {
		this.orgSerialNo = orgSerialNo;
	}

	public String getSerialSegment() {
		return serialSegment;
	}

	public void setSerialSegment(String serialSegment) {
		
		this.serialSegment = serialSegment;
		
		String[] strings = StringUtils.split(serialSegment, ",");
		
		if (strings != null) {
			codeRule = StringUtils.tolong(strings[0]);
			dateTime = StringUtils.tolong(strings[1]);
			serialNum = StringUtils.tolong(strings[2]);
		}
		
	}

	public long getCodeRule() {
		return codeRule;
	}

	public long getDateTime() {
		return dateTime;
	}

	public long getSerialNum() {
		return serialNum;
	}

	public int getReportflag() {
		return reportflag;
	}

	public void setReportflag(int reportflag) {
		this.reportflag = reportflag;
	}

	public int getRecvStatus() {
		return recvStatus;
	}

	public void setRecvStatus(int recvStatus) {
		this.recvStatus = recvStatus;
	}

	public String getSendResult() {
		return sendResult;
	}

	public void setSendResult(String sendResult) {
		this.sendResult = sendResult;
	}

	public String getDealResult() {
		return dealResult;
	}

	public void setDealResult(String dealResult) {
		this.dealResult = dealResult;
	}

	public String getGateLinkId() {
		return gateLinkId;
	}

	public void setGateLinkId(String gateLinkId) {
		this.gateLinkId = gateLinkId;
	}

	@Override
	public int hashCode() {
		
		int result = 0;
		
		if (sequence != null) {
			result += sequence.hashCode();
		}
		
		if (user != null) {
			result += user.hashCode();
		}
		
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		
		if (obj instanceof SmsEntity) {
			
			SmsEntity entity = (SmsEntity)obj;
			
			return StringUtils.equals(this.sequence, entity.sequence) 
					&& StringUtils.equals(this.user, entity.user);
			
		} else {
			return false;
		}
		
	}
}
